package ClasesDeApoyo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

import Grafo.Arco;
import Grafo.Vertice;
import ROV.ROV;

public class Cargador 
{
	
	
	// -----------------------------------------------------------------
	// Constructor
	// -----------------------------------------------------------------
	
	/**
	 * Metodo que construye un nuevo cargador
	 * @param ruta la ruta del archivo donde estab  los datos a importar
	 * @param rov el programa ROV que sera actualizado
	 */
	public Cargador(BufferedReader bof, ROV rov)
	{
		cargar(bof, rov);
		
	}
	
	// -----------------------------------------------------------------
	// Constructor
	// -----------------------------------------------------------------
	

	/**
	 * Metodo que carga todos los datos y actualiza el ROV
	 * <b>pre:</b> La clase ROV ya esta inicializada y el archivo Read.in tambien <br>
     * <b>post:</b> En la clase Rov queda Guardada la informacion del archivo como Grafo de vertices y Arcos. Tambien quedan registrados los casos que se van a analizar <br>
	 * @param ruta la ruta del archivo donde estab  los datos a importar
	 * @param rov el programa ROV que sera actualizado
	 */
	public void cargar(BufferedReader bof, ROV rov) {
		try 
		{
			int nRutas = 0;
			int nCiudades = 0;
			
			ArrayList<Vertice> vertices = new ArrayList<Vertice>();
			ArrayList<String> casosAEvaluar = new ArrayList<String>();
		
			
			
			
			
			BufferedReader bf = bof;
			
			String linea = bf.readLine();
			String[] params = linea.split(" ");
			
			nCiudades = Integer.parseInt(params[0]);
			nRutas = Integer.parseInt(params[1]);
			
			for(int i = 0; i < nCiudades; i ++)
			{
				 linea = bf.readLine();
				 params = linea.split(" ");
				 
				 Vertice nuevo = new Vertice(params[0], Integer.parseInt(params[1]), i);
				 vertices.add(nuevo);
			}
			
			for(int i = 0; i < nRutas; i ++)
			{
				 linea = bf.readLine();
				 
				 linea = bf.readLine();
				 params = linea.split(" ");
				 
				 int dia = Integer.parseInt(params[0]);
				 
				 linea = bf.readLine();
				 params = linea.split(" ");
				 
				 int hora = Integer.parseInt(params[0]);
				 int minuto = Integer.parseInt(params[1]);
				 int tiempoFrecuancia = Integer.parseInt(params[2]);
				 int numeroFrecuencias = Integer.parseInt(params[3]);
				 
				 linea = bf.readLine();
				 params = linea.split(" ");
				 int minutosTranscurridos = 0;
				 for (int j = 0; j < params.length; j = j +2) 
				 {
					
					int ciudad1 = Integer.parseInt(params[j]) - 1;
					int tiempo = Integer.parseInt(params[j+1]);
					if(tiempo != 0)
					{
						int ciudad2 = Integer.parseInt(params[j+2]) - 1;
						Fecha fechaInicio = null;
						if(minutosTranscurridos > 60*24*7)
						{
							 fechaInicio = new Fecha(dia, hora, minuto, true);
							 
						}
						else
						{
							fechaInicio = new Fecha(dia, hora, minuto, false);
						}
						boolean esPri = true;
						if(minutosTranscurridos >0)
						{
							
							fechaInicio.sumar(minutosTranscurridos);
							esPri = false;
						}
						
					
						Arco arc = new Arco(vertices.get(ciudad1), vertices.get(ciudad2), fechaInicio, tiempoFrecuancia, numeroFrecuencias,tiempo, esPri);
						vertices.get(ciudad1).agregarArco(arc);
					
						minutosTranscurridos += tiempo + vertices.get(ciudad2).getDuracionEstacion();
					}
					
				}
				 
				 
				 
			}
			
			
			
			linea = bf.readLine();
			while(linea!=null)
			{
				casosAEvaluar.add(linea);
				linea = bf.readLine();
				
			}
			
			
			for (int i = 0; i < vertices.size(); i++) 
			{
				vertices.get(i).cerrarVertice();
			}
			
			
			
			
			int[] caminos = new int[nCiudades];
			int[] noMarcados = new int[nCiudades];
			
			int[] costos = new int[nCiudades];
			for(int i = 0; i < costos.length; i++)
			{
				costos[i] = Integer.MAX_VALUE;
				caminos[i] = -1;
				noMarcados[i] = 1;
			}
			
			
			rov.setVertices(new Vertice[vertices.size()]);
			rov.setVertices( vertices.toArray(rov.getVertices()));
			
			rov.setCasosAEvauar(new String[casosAEvaluar.size()]);
			rov.setCasosAEvauar(casosAEvaluar.toArray(rov.getCasosAEvauar()));
			
			rov.setCostos(costos);
			rov.setCaminoArco(caminos);
			rov.setCaminoVertice(caminos);
			rov.setNoMarcados(vertices);
			
			bf.close();
			
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
